package com.hu.system.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.hu.common.core.domain.AjaxResult;
import com.hu.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 容错BigDecimal转换器
 * 参考原ExcelUtil的转换逻辑
 * <p>
 * 转换规则（与原ExcelUtil保持一致）：
 * 1. 数字类型：直接转BigDecimal
 * 2. 字符串类型：尝试转换，失败返回ZERO
 * 3. 空值：返回ZERO
 * 4. 异常情况：返回ZERO（不抛异常）
 *
 * @author hu-erp
 */
public class TolerantBigDecimalConverter implements Converter<BigDecimal> {

    private static final Logger log = LoggerFactory.getLogger(TolerantBigDecimalConverter.class);

    @Override
    public Class<BigDecimal> supportJavaTypeKey() {
        return BigDecimal.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null; // 支持所有Excel类型
    }

    /**
     * 读取Excel时的转换
     * 参考ExcelUtil.getCellValue + Convert.toBigDecimal逻辑
     */
    @Override
    public BigDecimal convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                        GlobalConfiguration globalConfiguration) {
        if (cellData == null) {
            return BigDecimal.ZERO;
        }

        try {
            Object val = "";

            // 第一步：根据单元格类型获取值（模拟getCellValue）
            switch (cellData.getType()) {
                case NUMBER:
                    // 数字类型
                    BigDecimal numberValue = cellData.getNumberValue();
                    if (numberValue != null) {
                        // 如果有小数，保留BigDecimal；否则转为字符串
                        if (numberValue.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) != 0) {
                            val = numberValue;
                        } else {
                            val = new DecimalFormat("0").format(numberValue);
                        }
                    }
                    break;

                case STRING:
                    // 字符串类型
                    String stringValue = cellData.getStringValue();
                    if (stringValue != null) {
                        val = stringValue.trim();
                    }
                    break;

                case BOOLEAN:
                    // 布尔类型：true=1, false=0
                    return cellData.getBooleanValue() ? BigDecimal.ONE : BigDecimal.ZERO;

                case ERROR:
                case EMPTY:
                default:
                    return BigDecimal.ZERO;
            }

            // 第二步：转换为BigDecimal（模拟Convert.toBigDecimal）
            if (val == null) {
                return BigDecimal.ZERO;
            }

            if (val instanceof BigDecimal) {
                return (BigDecimal) val;
            }

            String strVal = val.toString().trim();

            // 空值返回ZERO
            if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
                return BigDecimal.ZERO;
            }

            // 尝试转换
            try {
                return new BigDecimal(strVal);
            } catch (NumberFormatException e) {
                // 转换失败，返回ZERO
                log.debug("无法转换 '{}' 为BigDecimal，返回ZERO", strVal);
                return BigDecimal.ZERO;
            }

        } catch (Exception e) {
            // 异常情况返回ZERO
            log.warn("转换BigDecimal失败，返回ZERO", e);
            return BigDecimal.ZERO;
        }
    }

    /**
     * 写入Excel时的转换
     */
    @Override
    public WriteCellData<?> convertToExcelData(BigDecimal value, ExcelContentProperty contentProperty,
                                                GlobalConfiguration globalConfiguration) {
        if (value == null) {
            return new WriteCellData<>("0");
        }
        // 转为String以确保兼容性
        return new WriteCellData<>(value.toString());
    }
}

